"use strict"

/**
 * @Node方法 Node环境下的公共方法。目前包含：
 *   nodeXlsxToAoa() 直接从本地读取xlsx文件为AOA对象
 *   nodeAoaToJsFile() 将AOA对象以JS文件写入本地
 */

/**
 * @库导入
 */
// 导入node文件系统
import fs from "node:fs"
// 导入xlsx库，以XLSX作为引用对象
import XLSX from "xlsx"


/**
 * @nodeXlsxToAoa
 * @function 直接从本地读取xlsx文件为AOA对象
 * @param { String } filePathName 文件（含路径）。
 * @returns { (String | Number)[][] } AOA数组。
 */
export function nodeXlsxToAoa(filePathName) { try {
  // 记个时
  console.time("读取文件耗时")
  console.log("开始直接从本地读取xlsx文件为AOA对象...")
  // 直接从路径读取工作簿
  const workbook = XLSX.readFile(filePathName)
  // 获取工作簿的第一个工作表
  const workSheet = workbook.Sheets[workbook.SheetNames[0]]
  // 将工作表转为AOA数据
  const sheetDataAoa = XLSX.utils.sheet_to_json(workSheet, {
    // 标题设置为“1模式”，即AOA呈现
    header: 1,
    // 不允许空白行，遇空白行则跳过
    blankrows: false
  })
  // 输出耗时
  console.timeEnd("读取文件耗时")
  // 返回AOA数据
  return sheetDataAoa
} catch (err) {
  console.error("nodeXlsxToAoa()报错: ", err)
}}


/**
 * @nodeAoaToJsFile
 * @function 将AOA对象以JS文件写入本地
 * @param { (String | Number)[][] } aoa 需要写入的AOA对象。
 * @param { String } filePath 文件路径。若输入相对路径，则以该项目路径为参考。
 * @param { Boolean } [isCompress] 是否压缩文件内容。
 */
export function nodeAoaToJsFile(aoa, filePathName, isCompress = true) { try {
  // 记个时
  console.time("导出文件耗时")
  console.log("开始导出AOA对象为JS文件...")
  // 用正则表达式从路径中提取到对象名称，其中[1]就会是对象名称
  const fileNameMatch = filePathName.match(/([^/]+)\.js$/)[1]
  // 声明一个aoaString对象并初始化，用于接收AOA对象转成的字符串
  // 用isCompress传参判断是否压缩文件内容
  const aoaString = (isCompress)
    ?
    `export const ${ fileNameMatch } = ${ JSON.stringify(aoa) }`
    :
    `export const ${ fileNameMatch } = ${ JSON.stringify(aoa, null, 2) }`
  // 写入文件
  fs.writeFileSync(filePathName, aoaString)
  // 输出耗时
  console.timeEnd("导出文件耗时")
} catch (err) {
  console.error("nodeAoaToJsFile()报错: ", err)
}}


export function bufferToArray(buffer) {
  const dataView = new DataView(buffer)
  const array = []
  for (let i = 0; i < dataView.byteLength; i++) {
    array.push(dataView.getUint8(i))
  }
  return array
}